/*
 * Copyright (C) 2025 Tsingteng MicroSystem
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
#ifndef _HCI_TRANSPORT_H_
#define _HCI_TRANSPORT_H_
#include "nfa_base.h"

typedef void (*tHCI_HCP_EVENT_HANDLE)(uint8_t pipe, const uint8_t *data, uint16_t data_len);

/**
 * @brief 初始化hci transport层
 * @note 初始化transport层需要的内存和锁，向data模块注册HCI data通道的数据回调
 * @return 成功时返回NCI_STATUS_OK
 */
tNCI_STATUS hci_transport_init(void);

/**
 * @brief hci transport层去初始化
 * @note 释放所有内存和锁，注销向data模块注册的数据回调
 * @return 成功时返回NCI_STATUS_OK
 */
tNCI_STATUS hci_transport_deinit(void);

/**
 * @brief 注册某个pipe的hci event回调
 * @param pipe   关注的pipe
 * @param handle 回调方法
 * @return 成功时返回NCI_STATUS_OK
 */
tNCI_STATUS hci_transport_register_pipe_event_handler(uint8_t pipe, tHCI_HCP_EVENT_HANDLE handle);

/**
 * @brief 处理远端EE发送过来的指令
 * @param pipe      cmd来源的pipe
 * @param ins       指令值
 * @param data      指令参数
 * @param data_len  指令参数长度
 */
void hci_handle_remote_cmd(uint8_t pipe, uint8_t ins, const uint8_t *data, uint16_t data_len);

/**
 * @brief 发送hcp包
 * @note 异步发送接口，不会等待回复，如果hci data通道credits不足会阻塞等待
 * @param pipe_id  要往哪个pipe发送数据
 * @param ins_type hcp包的类型
 * @param ins      hcp包的指令
 * @param data_len hcp包所带的数据长度
 * @param data     hcp包所带的数据
 * @return 成功时返回NCI_STATUS_OK
 */
tNCI_STATUS hci_send_hcp_message_async(uint8_t pipe_id, uint8_t ins_type, uint8_t ins,
                                     uint16_t data_len, const uint8_t *data);

/**
 * @brief 发送hcp cmd并等待rsp
 * @note  rsp_data需要由调用者进行释放
 * @param pipe_id   要操作的pipe
 * @param ins_type  hcp数据包类型，此方法只支持HCI_HCP_TYPE_CMD类型
 * @param ins       要发送的指令
 * @param data_len  要发送的指令参数长度
 * @param data      要发送的指令参数
 * @param rsp_len   回复的数据长度
 * @param rsp_data  回复的数据，包含HCP header和data
 * @return 成功时返回NCI_STATUS_OK，不会对rsp code做处理，指令有响应即会返回成功
 */
tNCI_STATUS hci_process_hcp_message(uint8_t pipe_id, uint8_t ins_type, uint8_t ins,
                                     uint16_t data_len, const uint8_t *data,
                                     uint16_t *rsp_len, uint8_t **rsp_data);
#endif
